CloudFormationでEC2を作成する際に”The parameter groupName cannot be used with the parameter subnet”というエラーに遭遇したときの対処方法
テスト用のEC2をCloudFormationで作成した際に"The parameter groupName cannot be used with the parameter subnet"というエラーがが発生しました。
その時に確認した部分をブログに残します。
エラーが発生したCloudFormationテンプレート
以下のCloudFormationテンプレートをエラーが発生したときに使用していました。
AWSTemplateFormatVersion: "2010-09-09" Description: test Stack Metadata: # ------------------------------------------------------------# # Metadata # ------------------------------------------------------------# AWS::CloudFormation::Interface: ParameterGroups: - Label: default: Parameters for VPC Parameters: - VPCCIDR - Label: default: Parameters for Subnet Parameters: - PublicSubnet01CIDR - Label: default: Parameters for ec2 Parameters: - EC2VolumeSize - EC2VolumeIOPS - EC2AMI - EC2InstanceType Parameters: # ------------------------------------------------------------# # Parameters # ------------------------------------------------------------# VPCCIDR: Default: 172.30.0.0/16 Type: String PublicSubnet01CIDR: Default: 172.30.3.0/24 Type: String EC2VolumeSize: Default: 32 Type: Number EC2VolumeIOPS: Default: 3000 Type: Number EC2AMI: Default: ami-079cd5448deeace01 Type: AWS::EC2::Image::Id EC2InstanceType: Default: t3.micro Type: String Resources: # ------------------------------------------------------------# # IAM # ------------------------------------------------------------# EC2IAMRole: Type: AWS::IAM::Role Properties: AssumeRolePolicyDocument: Version: "2012-10-17" Statement: - Effect: Allow Principal: Service: - ec2.amazonaws.com Action: - 'sts:AssumeRole' ManagedPolicyArns: - arn:aws:iam::aws:policy/AmazonSSMManagedInstanceCore RoleName: iam-role-ec2 Tags: - Key: Name Value: iam-role-ec2 EC2IAMInstanceProfile: Type: AWS::IAM::InstanceProfile Properties: InstanceProfileName: iam-instanceprofile-ec2 Roles: - !Ref EC2IAMRole # ------------------------------------------------------------# # VPC # ------------------------------------------------------------# VPC: Type: AWS::EC2::VPC Properties: CidrBlock: !Ref VPCCIDR EnableDnsSupport: true EnableDnsHostnames: true Tags: - Key: Name Value: test-vpc # ------------------------------------------------------------# # InternetGateway # ------------------------------------------------------------# InternetGateway: Type: AWS::EC2::InternetGateway Properties: Tags: - Key: Name Value: !Sub test-igw InternetGatewayAttachment: Type: AWS::EC2::VPCGatewayAttachment Properties: InternetGatewayId: !Ref InternetGateway VpcId: !Ref VPC # ------------------------------------------------------------# # Subnet # ------------------------------------------------------------# PublicSubnet01: Type: AWS::EC2::Subnet Properties: AvailabilityZone: ap-northeast-1a CidrBlock: !Ref PublicSubnet01CIDR MapPublicIpOnLaunch: true Tags: - Key: Name Value: !Sub test-public-subnet-01 VpcId: !Ref VPC # ------------------------------------------------------------# # RouteTable # ------------------------------------------------------------# PublicRouteTable: Type: AWS::EC2::RouteTable Properties: VpcId: !Ref VPC Tags: - Key: Name Value: test-public-rtb PublicRouteTableRoute: Type: AWS::EC2::Route Properties: DestinationCidrBlock: 0.0.0.0/0 GatewayId: !Ref InternetGateway RouteTableId: !Ref PublicRouteTable PublicRtAssociation1: Type: AWS::EC2::SubnetRouteTableAssociation Properties: RouteTableId: !Ref PublicRouteTable SubnetId: !Ref PublicSubnet01 # ------------------------------------------------------------# # Security Group # ------------------------------------------------------------# EC2SG: Type: AWS::EC2::SecurityGroup Properties: GroupDescription: for ec2 GroupName: test-sg-ec2 SecurityGroupIngress: - FromPort: 80 IpProtocol: tcp CidrIp: 0.0.0.0/0 ToPort: 80 Tags: - Key: Name Value: test-sg-ec2 # ------------------------------------------------------------# # EC2 # ------------------------------------------------------------# EC2: Type: AWS::EC2::Instance Properties: BlockDeviceMappings: - DeviceName: /dev/xvda Ebs: DeleteOnTermination: true Encrypted: true Iops: !Ref EC2VolumeIOPS VolumeSize: !Ref EC2VolumeSize VolumeType: gp3 DisableApiTermination: false IamInstanceProfile: !Ref EC2IAMInstanceProfile ImageId: !Ref EC2AMI InstanceType: !Ref EC2InstanceType SecurityGroupIds: - !Ref EC2SG SubnetId: !Ref PublicSubnet01 Tags: - Key: Name Value: test-ec2 UserData: !Base64 | #!/bin/bash dnf install httpd -y systemctl start httpd systemctl enable httpd
上記のCloudFormationテンプレートを使用してデプロイすると以下の画像のようにエラーが発生します。
エラーが発生したときにやったこと
まずはエラー内容で検索を行いました。
検索を行うと一番上に以下のブログが出てきます。
こちらのブログではAWS CLIの内容にはなりますが、「security-groups」と「security-group-ids」というEC2起動時に使用できるパラメータについて記載されています。
この時点で念のためCloudFormationテンプレートを確認してみましたが、187行目で「SecurityGroupIds」を使用してセキュリティグループを指定していることを確認しています。
エラーの修正
エラーの原因としてはセキュリティグループの作成部分にありました。
エラーが発生するCloudFormationテンプレートではセキュリティグループの作成部分でVPCの指定が抜けていました。
以下のようにVPCの指定が抜けている場合、デフォルトVPCにセキュリティグループが作成されていました。
EC2SG: Type: AWS::EC2::SecurityGroup Properties: GroupDescription: for ec2 GroupName: test-sg-ec2 SecurityGroupIngress: - FromPort: 80 IpProtocol: tcp CidrIp: 0.0.0.0/0 ToPort: 80 Tags: - Key: Name Value: test-sg-ec2
エラーを直すにはセキュリティグループの作成部分でVPCの指定を行います。
今回の場合であればCloudFormationの組み込み関数であるFn::Ref関数を使用してVPCのIDを設定します。
EC2SG: Type: AWS::EC2::SecurityGroup Properties: GroupDescription: for ec2 GroupName: test-sg-ec2 SecurityGroupIngress: - FromPort: 80 IpProtocol: tcp CidrIp: 0.0.0.0/0 ToPort: 80 Tags: - Key: Name Value: test-sg-ec2 VpcId: !Ref VPC
さいごに
エラーメッセージだけだと原因が分かりにくい内容ですがよくよく関連しているリソースまで確認してみると足りない設定が見つかることがあります。